class Solution {
public:
    using ll=long long;
    long long minTime(vector<int>& skill, vector<int>& mana) { //每名巫师的熟练度/法力值 每个药水的法力值
        int n=skill.size(); //n个巫师
        vector<ll> lastFinish(n); //第i名巫师完成上一瓶药水的时间
        for(int m:mana)
        {
            ll sum=0;
            for(int i=0; i<n; i++) sum=max(sum, lastFinish[i])+skill[i]*m; //(已知最大时间, 每瓶药水由上一位巫师i-1的结束时间)+当前巫师的处理时间

            lastFinish[n-1]=sum; //逆拓扑
            for(int i=n-2; i>=0; i--) lastFinish[i]=lastFinish[i+1]-skill[i+1]*m; //倒退
        }
        return lastFinish[n-1];
    }
};